package org.example.string;


/**
 * 深度剖析 new String() 中的细节
 * 注意点：
 * 1. 调用toString()，在toString中new String() 并不会将调用者的信息存储到字符串常量池中
 * 2. 通过new String("a") 的时候，会在内存中创建一个 "a"对象，也会在字符串常量池中创建一个 "a" 对象
 * @author youshang
 * @date 2022/03/28 09:34
 **/
public class StringNewTest {
    public static void main(String[] args) {

        /*
        创建了几个对象？
        1. 创建了两个对象
             一个是当new的时候存在于内存中的，另外一个是存在于字符串常量池中
        2. 通过字节码可以观察到，ldc这么一个指令，将 "ab" 存入了字符串常量池
         */
        String ab = new String("ab");

        /*
            创建了几个对象？
            对象1：new StringBuilder()
            对象2：new String("a")
            对象3：字符串常量池中的 "a"
            对象4：new String("b")
            对象5：字符串常量池中的 "b"

            深度剖析：在字符串变量拼接的时候会创建一个StringBuilder去拼接对象，当最终返回对象的时候会去调用toString() 方法，
            此时会在内存中新开辟一个内存创建一个 String对象，通过 jclasslib 查看toString 的字节码发现，
            只有new String() 没有将toString() 的属性存入字符串常量池
            对象6：在toString(); 方法中在内存中创建了一个拼接好的String对象
         */
        String s = new String("a") + new String("b");

    }
}
